package com.info33.platform.system.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.info33.platform.business.app.vo.AppCenterVO;
import com.info33.platform.config.shiro.token.UserToken;
import com.info33.platform.system.dto.SysUserDTO;
import com.info33.platform.system.entity.SysUser;
import com.info33.platform.system.vo.SysDeptPostVO;
import com.info33.platform.system.vo.SysUserDetailVO;
import com.info33.platform.system.vo.SysUserPerfect;
import com.info33.platform.system.vo.SysUserVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author admin
 */
@Repository
public interface SysUserDao extends BaseMapper<SysUser> {

    /**
     * 获取用户基础信息 和 拓展资料
     *
     * @param uid 用户 id
     * @param tid 租户 id
     * @return vo
     */
    SysUserPerfect getBaseAndProfile(@Param("uid") Long uid, @Param("tid") Long tid);

    /**
     * 获取用户基础信息 和 拓展资料
     *
     * @param mobile 手机号
     * @param tid    租户 id
     * @return vo
     */
    SysUserPerfect getBaseAndProfile(@Param("mobile") String mobile, @Param("tid") Long tid);

    /**
     * 用户表 + 租户表
     *
     * @param userToken -
     * @param tid       租户 id
     * @param type      不同的登录方式
     * @return -
     */
    SysUserVO login(@Param("userToken") UserToken userToken, @Param("tid") Long tid, @Param("type") Integer type);

    /**
     * 新增用户信息
     *
     * @param sysUser-
     * @return -
     */
    int insertSysUser(@Param("sysUser") SysUser sysUser);

    /**
     * 用户租户表，角色表，部门岗位表
     *
     * @param page-
     * @param dto-
     * @param deptIds-
     * @param currentUser-
     * @return -
     */
    Page<SysUserVO> getUserListByDeptId(@Param("page") Page<SysUser> page, @Param("dto") SysUserDTO dto, @Param("deptIds") List<Long> deptIds, @Param("currentUser") SysUserVO currentUser);

    /**
     * 根据租户id和登录名获取用户信息
     *
     * @param tenantId  租户id
     * @param loginName 登录名
     * @return
     */
    SysUser getByTenantIdAndLoginName(@Param("tenantId") Long tenantId, @Param("loginName") String loginName);

    /**
     * 获取用户信息详情
     *
     * @param id
     * @return
     */
    SysUserDetailVO getUserDetail(Long id);

    /**
     * 租户用户表 + 用户拓展信息表 + 部门岗位表+ 部门表 + 岗位表
     *
     * @param sysCurrentUser-
     * @return -
     */
    SysUserVO pcBaseInfo(@Param("sysCurrentUser") SysUserVO sysCurrentUser);

    /**
     * 获取用户（不包含ADMIN）
     *
     * @param page
     * @param dto
     * @param idList
     * @param sysCurrentUser
     * @return
     */
    Page<SysUserVO> specificUserList(@Param("page") Page<SysUser> page, @Param("dto") SysUserDTO dto,
                                     @Param("deptIds") List<Long> idList, @Param("currentUser") SysUserVO sysCurrentUser);

    /**
     * 用户表 + 部门表 + 岗位表
     *
     * @param sysCurrentUser-
     * @return -
     */
    SysUserVO pcDetail(@Param("sysCurrentUser") SysUserVO sysCurrentUser);


    /**
     * 根据租户id和岗位id获取岗位信息
     *
     * @param tenantId 租户id
     * @param roleId   岗位id
     * @return
     */
    Map<String, Object> queryRoleListById(@Param("roleId") String roleId, @Param("tenantId") Long tenantId);

    /**
     * 根据租户id和部门id获取部门信息
     *
     * @param tenantId 租户id
     * @param deptId   部门id
     * @return
     */
    Map<String, Object> queryDeptListByIds(@Param("deptId") String deptId, @Param("tenantId") Long tenantId);

    /**
     * 根据租户id和用户id获取用户信息
     *
     * @param tenantId 租户id
     * @param userId   用户id
     * @return
     */
    Map<String, Object> queryUserListById(@Param("userId") Long userId, @Param("tenantId") Long tenantId);

    /**
     * 根据用户id查询同级别部门id及上级部门id
     *
     * @param tenantId 租户id
     * @param userId   用户id
     * @return
     */
    Map<String, Object> queryUserSameLevelDeptAndParent(@Param("userId") Long userId, @Param("tenantId") Long tenantId);

    List<SysUserDetailVO> getUserDetailList(@Param("id") String id);

    /**
     * app 端登录
     *
     * @param userToken-
     * @param type-
     * @return -
     */
    SysUserVO appLogin(@Param("userToken") UserToken userToken, @Param("type") Integer type);


    /**
     * 用户信息
     *
     * @param tUid sys_tenant_user id
     * @return -
     */
    SysUserVO getByTenantUserId(@Param("tUid") Long tUid);

    /**
     * 农友圈，用户基础信息
     *
     * @param uid sys_use id
     * @return -
     */
    SysUserVO dynamicInfo(@Param("uid") Long uid);

    Page<SysUserDetailVO> getAllUser(Page<SysUser> page, @Param("dto") SysUserDTO dto, @Param("tenantId") Long tenantId);

    List<SysUserDetailVO> getAllUser(@Param("dto") SysUserDTO dto, @Param("tenantId") Long tenantId);

    /**
     * 根据用户id 获取所有部门-岗位信息
     *
     * @param uid
     * @return
     */
    List<SysDeptPostVO> getDeptPostList(@Param("id") Long uid);

    /**
     * app - 个人中心
     *
     * @param id 当前租户用户 id
     * @return vo
     */
    AppCenterVO appCenter(@Param("id") Long id);

    SysUserPerfect pcBaseEcho(SysUserDTO dto);

    /**
     * 用户编辑时回显信息
     *
     * @param userId 用户 id
     * @return vo
     */
    SysUserVO pcEditEcho(@Param("userId") Long userId);

    /**
     * 根据租户用户 id，获取用户登录名
     *
     * @param userId 租户用户 id
     * @return 登录名
     */
    String getLoginNameByTenantUserId(
            @Param("userId") Long userId);
}